package org.android.SuperList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;



public class DbAdapter 
{
    
    private static final String DATABASE_NAME = "uno.db"; 
    public static final String TABLA_LISTAS = "tbl_listas";
    public static final String TABLA_GASTOS ="tbl_gastos";
    public static final String TABLA_MONEDAS="tbl_monedas";
    public static final String TABLA_FORMASPAGO="tbl_formaspago";
    public static final String TABLA_RELACIONESLISTASGASTOS ="tbl_relacioneslistasgastos";
    public static final String TABLA_DETALLELISTASGASTOS = "tbl_detallelistasgastos";
    public static final String VISTA_LISTADESGLOSADA = "vw_listadesglosada";
    public static final String VISTA_LISTAS = "vw_listas";
    public static final String ID = "_id";
    public static final String ID_LISTA = "idlista";
    public static final String ID_GASTO = "idgasto";
    public static final String ID_MONEDA = "idmoneda";
    public static final String ID_FORMAPAGO = "idformapago";
    public static final String ID_RELACIONLISTAGASTO = "idrelacionlistagasto";
	public static final String LISTA = "lista";
    public static final String PRESUPUESTO = "presupuesto";
    public static final String GASTO = "gasto";
    public static final String GASTOS= "gastos";
    public static final String MONTO = "monto";
    public static final String FECHA = "fecha";
    public static final String MONEDA = "moneda";
    public static final String FORMA_PAGO = "formapago";
    public static final String ICONO = "icono";
    public static final String DIFERENCIA = "diferencia";
    public static final String TRIGGER_DEL_TBL_GASTOS="trg_del_"+TABLA_GASTOS;
    public static final String TRIGGER_DEL_TBL_MONEDAS="trg_del_"+TABLA_MONEDAS;
    public static final String TRIGGER_DEL_TBL_FORMASPAGOS="trg_del_"+TABLA_FORMASPAGO;
    public static final String ERROR_INTEGRIDAD="@string/msg_integridad";
    
    
    private static final int DATABASE_VERSION =3;
    
    private final Context mCtx;    
    private static final String TAG = "DbAdapter";
    private DataBaseHelper mDbHelper;
    private SQLiteDatabase mDb;
    
    
	
    private static final String CREATE_TBL_LISTAS = "create table "+TABLA_LISTAS+" ("+ID+" integer primary key autoincrement,"+LISTA+" text not null, "+PRESUPUESTO+" real not null);";
    
    private static final String CREATE_TBL_GASTOS = "create table "+TABLA_GASTOS+" ("+ID+" integer primary key autoincrement,"+GASTO+" text not null);";
    
    private static final String CREATE_TBL_MONEDAS = "create table "+TABLA_MONEDAS+" ("+ID+" integer primary key autoincrement,"+MONEDA+" text not null);";
    
    private static final String CREATE_TBL_FORMASPAGOS = "create table "+TABLA_FORMASPAGO+" ("+ID+" integer primary key autoincrement,"+FORMA_PAGO+" text not null, "+ICONO+" text);";
      
    private static final String CREATE_TBL_RELACIONESLISTASGASTOS = "create table "+TABLA_RELACIONESLISTASGASTOS+" ("+ID+" integer primary key autoincrement,"+ID_LISTA+" integer not null,"+ID_GASTO+" integer not null,"+MONTO+" real not null,"+FECHA+" date not null, "+ID_MONEDA+" integer not null,"+ID_FORMAPAGO+" integer not null);";
    
    private static final String CREATE_VIEW_LISTADESGLOSADA="create view "+VISTA_LISTADESGLOSADA+" as Select "+TABLA_RELACIONESLISTASGASTOS+"."+ID+" as "+ID+","+TABLA_LISTAS+"."+ID+" as "+ID_LISTA+","+TABLA_LISTAS+"."+LISTA+" as "+LISTA+","+TABLA_LISTAS+"."+PRESUPUESTO+" as "+PRESUPUESTO+","+TABLA_GASTOS+"."+GASTO+" as "+GASTO+","+TABLA_RELACIONESLISTASGASTOS+"."+MONTO+" as "+MONTO+","+TABLA_RELACIONESLISTASGASTOS+"."+FECHA+" as "+FECHA+","+TABLA_MONEDAS+"."+MONEDA+" as "+MONEDA+","+TABLA_FORMASPAGO+"."+FORMA_PAGO+" as "+FORMA_PAGO+" from "+TABLA_RELACIONESLISTASGASTOS+" inner join "+TABLA_LISTAS+" on "+TABLA_RELACIONESLISTASGASTOS+"."+ID_LISTA+"="+TABLA_LISTAS+"."+ID+" inner join "+TABLA_GASTOS+" on "+TABLA_RELACIONESLISTASGASTOS+"."+ID_GASTO+"="+TABLA_GASTOS+"."+ID+" inner join "+TABLA_MONEDAS+" on "+TABLA_RELACIONESLISTASGASTOS+"."+ID_MONEDA+"="+TABLA_MONEDAS+"."+ID+" inner join "+TABLA_FORMASPAGO+" on "+TABLA_RELACIONESLISTASGASTOS+"."+ID_FORMAPAGO+"="+TABLA_FORMASPAGO+"."+ID;

    private static final String CREATE_VIEW_LISTAS="create view "+VISTA_LISTAS+" as select tbl_listas."+ID+" AS "+ID+", "+TABLA_LISTAS+"."+LISTA+" AS "+LISTA+", "+TABLA_LISTAS+"."+PRESUPUESTO+" AS "+PRESUPUESTO+", ifnull(( select sum("+TABLA_RELACIONESLISTASGASTOS+"."+MONTO+") from "+TABLA_RELACIONESLISTASGASTOS+" where "+TABLA_RELACIONESLISTASGASTOS+"."+ID_LISTA+" = "+TABLA_LISTAS+"."+ID+" ) , 0 ) as "+GASTOS+", ( "+TABLA_LISTAS+"."+PRESUPUESTO+" - ifnull(( select sum("+TABLA_RELACIONESLISTASGASTOS+"."+MONTO+") from "+TABLA_RELACIONESLISTASGASTOS+" where "+TABLA_RELACIONESLISTASGASTOS+"."+ID_LISTA+" = "+TABLA_LISTAS+"."+ID+"  ),0) )as "+DIFERENCIA+" from "+TABLA_LISTAS;
    
    private static final String CREATE_TRIGER_DELETE_TBL_GASTOS="CREATE TRIGGER "+TRIGGER_DEL_TBL_GASTOS+" BEFORE DELETE ON "+TABLA_GASTOS+" FOR EACH ROW BEGIN   SELECT CASE    WHEN ((SELECT "+ID_GASTO+" FROM "+TABLA_RELACIONESLISTASGASTOS+" WHERE "+ID_GASTO+" = OLD."+ID+") IS NOT NULL)    THEN RAISE    (ABORT,'"+ERROR_INTEGRIDAD+"')  END;END;";
    
    private static final String CREATE_TRIGER_DELETE_TBL_MONEDAS="CREATE TRIGGER "+TRIGGER_DEL_TBL_MONEDAS+" BEFORE DELETE ON "+TABLA_MONEDAS+" FOR EACH ROW BEGIN   SELECT CASE    WHEN ((SELECT "+ID_MONEDA+" FROM "+TABLA_RELACIONESLISTASGASTOS+" WHERE "+ID_MONEDA+" = OLD."+ID+") IS NOT NULL)    THEN RAISE    (ABORT,'"+ERROR_INTEGRIDAD+"')  END;END;";
    
    private static final String CREATE_TRIGER_DELETE_TBL_FORMASPAGO="CREATE TRIGGER "+TRIGGER_DEL_TBL_FORMASPAGOS+" BEFORE DELETE ON "+TABLA_FORMASPAGO+" FOR EACH ROW BEGIN   SELECT CASE    WHEN ((SELECT "+ID_FORMAPAGO+" FROM "+TABLA_RELACIONESLISTASGASTOS+" WHERE  "+ID_FORMAPAGO+" = OLD."+ID+") IS NOT NULL)    THEN RAISE    (ABORT,'"+ERROR_INTEGRIDAD+"')  END;END;";
    
    

    private static class DataBaseHelper extends SQLiteOpenHelper 
    {
    	 DataBaseHelper(Context context) 
    	 {
             super(context, DATABASE_NAME, null, DATABASE_VERSION);
         }

         @Override
         public void onCreate(SQLiteDatabase db) 
         {
        	 try
        	 {
        	 Log.w(TAG, "creando las bases de datos");
             db.execSQL(CREATE_TBL_LISTAS);
             db.execSQL(CREATE_TBL_GASTOS);
             db.execSQL(CREATE_TBL_MONEDAS);
             db.execSQL(CREATE_TBL_FORMASPAGOS);
             db.execSQL(CREATE_TBL_RELACIONESLISTASGASTOS);
             db.execSQL(CREATE_VIEW_LISTADESGLOSADA);
             db.execSQL(CREATE_VIEW_LISTAS);
             db.execSQL(CREATE_TRIGER_DELETE_TBL_GASTOS);
             db.execSQL(CREATE_TRIGER_DELETE_TBL_MONEDAS);
             db.execSQL(CREATE_TRIGER_DELETE_TBL_FORMASPAGO);
        	 }
        	 catch(Exception ex1)
        	 {
        		 Log.e("Erro al crear","Error: "+ex1);
        	 }
         }

         @Override
         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
         {
        	 try
        	 {
	             Log.w(TAG, "Actualizado base de datos de la version  " + oldVersion + " a "+ newVersion + ", con la destruccion de todos los datos existentes");
	             db.execSQL("DROP TABLE IF EXISTS "+TABLA_LISTAS);
	             db.execSQL("DROP TABLE IF EXISTS "+TABLA_RELACIONESLISTASGASTOS);
	             db.execSQL("DROP TABLE IF EXISTS "+TABLA_GASTOS);
	             db.execSQL("DROP TABLE IF EXISTS "+TABLA_MONEDAS);
	             db.execSQL("DROP TABLE IF EXISTS "+TABLA_FORMASPAGO);
	             db.execSQL("DROP VIEW IF EXISTS "+VISTA_LISTADESGLOSADA);
	             db.execSQL("DROP VIEW IF EXISTS "+VISTA_LISTAS);
	             onCreate(db);
        	 }
        	 catch(Exception exs)
        	 {
        		 Log.e("Erro al borra","Error: "+exs);
        	 }
         }
    }
    
    public DbAdapter(Context ctx)
    {
    	this.mCtx=ctx;	    	
    }
    
    public DbAdapter open() throws SQLException 
    {
        mDbHelper = new DataBaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }
    
    public void close() 
    {
        mDbHelper.close();
    }
        
    public boolean eliminaRegistro(String Tabla,long Id) 
    {
    	return mDb.delete(Tabla, ID+"=" + Id, null) > 0;
    }
    
    public Cursor RecuperaRegistrosTabla(String Tabla) 
    {
        return mDb.query(Tabla,recuperaColumnas(Tabla), null, null, null, null, null);
    }
    
    public Cursor RecuperaRegistros(String Tabla,long IdRegistro) throws SQLException 
    {
        Cursor mCursor = mDb.query(true, Tabla,recuperaColumnas(Tabla), ID + "=" + IdRegistro, null,null, null, null, null);
        if (mCursor != null) 
        {
            mCursor.moveToFirst();
        }
        return mCursor;
    }
    
    public Cursor RecuperaRegistros(String Tabla,String Columna ,long IdRegistro) throws SQLException 
    {
        Cursor mCursor = mDb.query(false, Tabla,recuperaColumnas(Tabla), Columna + "=" + IdRegistro, null,null, null, null, null);
        if (mCursor != null) 
        {
            mCursor.moveToFirst();
        }
        return mCursor;
    }
            
    public Long creaRegistro(String Tabla,String[] Valores)
    {
    	String[] Columnas = recuperaColumnas(Tabla);
    	ContentValues ValoresIniciales=new ContentValues();
    	for (int i=1;i<Valores.length;i++)
    	{
    		ValoresIniciales.put(Columnas[i].toString(),Valores[i].toString());
    		Log.i("creaRegistro()","Columna["+i+"]="+Columnas[i].toString()+" Valor["+i+"]="+Valores[i].toString());
    	}
    	return mDb.insert(Tabla,null,ValoresIniciales);
    }
    
    public boolean actualizaRegistro(String Tabla,String[] Valores)
    {
    	String[] Columnas = recuperaColumnas(Tabla);
    	ContentValues ValoresIniciales=new ContentValues();
    	for (int i=1;i<Valores.length;i++)
    	{
    		ValoresIniciales.put(Columnas[i],Valores[i]);   
    		Log.i("creaRegistro()","Columna["+i+"]="+Columnas[i].toString()+" Valor["+i+"]="+Valores[i].toString());
    	}
    	return mDb.update(Tabla,ValoresIniciales,ID+"="+Valores[0],null)>0;
    }
    
    public String[] recuperaColumnas(String Tabla)
    {
    	String[] Columnas={};
    	
    	if(Tabla==TABLA_LISTAS)
    		Columnas= new String[]{ID,LISTA,PRESUPUESTO};
    	if(Tabla==TABLA_GASTOS)
    		Columnas= new String[]{ID,GASTO};
    	if(Tabla==TABLA_MONEDAS)
    		Columnas= new String[]{ID,MONEDA};
    	if(Tabla==TABLA_FORMASPAGO)
    		Columnas= new String[]{ID,FORMA_PAGO,ICONO};
    	if(Tabla==TABLA_RELACIONESLISTASGASTOS)
    		Columnas= new String[]{ID,ID_LISTA,ID_GASTO,MONTO,FECHA,ID_MONEDA,ID_FORMAPAGO};
    	if(Tabla==VISTA_LISTADESGLOSADA)
    		Columnas= new String[]{ID,ID_LISTA,LISTA,PRESUPUESTO,GASTO,MONTO,FECHA,MONEDA,FORMA_PAGO};
    	if(Tabla==VISTA_LISTAS)
    		Columnas= new String[]{ID,LISTA,PRESUPUESTO,GASTOS,DIFERENCIA};
    	return (Columnas);
    }
}
